package com.br.negocio.dao;


import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.springframework.stereotype.Service;

import com.br.negocio.vo.VendaVO;
import com.br.negocio.vo.ContaReceberVO;

@Service("contaReceberDao")
public class ContaReceberDAO{
        
        @PersistenceContext
        private EntityManager entityManager;

        
        public void inserirContaReceber(ContaReceberVO contaReceberVO) {
                try {
                        entityManager.persist(contaReceberVO);
                } catch (Exception e) {
                        throw new RuntimeException("Erro ao inserir a conta a receber: " + e.getMessage(), e);
                }
        }
        
        
        public void atualizarContaReceber(ContaReceberVO contaReceberVO) {
                try {
                        entityManager.merge(contaReceberVO);
                } catch (Exception e) {
                        throw new RuntimeException("Erro ao atualizar a conta a receber: " + e.getMessage(), e);
                }
        }

        
        public void removerContaReceber(ContaReceberVO contaReceberVO) {
                try {
                        if (!entityManager.contains(contaReceberVO)) {
                                contaReceberVO = entityManager.merge(contaReceberVO);
                        }
                        entityManager.remove(contaReceberVO);
                } catch (Exception e) {
                        throw new RuntimeException("Erro ao remover a conta a receber: " + e.getMessage(), e);
                }
        }

        
        public ContaReceberVO obterContaReceber(ContaReceberVO contaReceberVO) {
                try {
                        return entityManager.find(ContaReceberVO.class, contaReceberVO.getCodigo());
                } catch (Exception e) {
                        throw new RuntimeException("Erro ao buscar a conta a receber: " + e.getMessage(), e);
                }
        }

        @SuppressWarnings("unchecked")
        public List<ContaReceberVO> obterListaContaReceber() {
                try {
                        List<ContaReceberVO> lista = (List<ContaReceberVO>) entityManager.createNamedQuery("loadAllContaReceber").getResultList();
                        if ((lista != null) && (!lista.isEmpty())) {
                                return lista;
                        } else {
                                return Collections.EMPTY_LIST;
                        }
                } catch (Exception e) {
                        throw new RuntimeException("Erro ao carregar as contas a receber.", e);
                }
        }
        
        @SuppressWarnings("unchecked")
        public ArrayList<ContaReceberVO> obterListaContaReceber(VendaVO venda) {
                Query query = entityManager.createNamedQuery("loadAllContaPagarByVenda");
                query.setParameter("codvenda", venda.getCodigo());
                ArrayList<ContaReceberVO> lista = (ArrayList<ContaReceberVO>)query.getResultList();
                if (lista.isEmpty()) {
                        return null;
                } else {
                        return lista;
                }
        }

        
        @SuppressWarnings("unchecked")
        public boolean validaDuplicado(ContaReceberVO contaReceberVO) {
                Query query = entityManager.createNamedQuery("findDuplicatedContaReceber");
                query.setParameter("descricao", contaReceberVO.getDescricao());
                List lista = query.getResultList();
                if (lista.isEmpty()) {
                        return true;
                } else {
                        return false;
                }
        }

        public void setEntityManager(EntityManager entityManager) {
                this.entityManager = entityManager;
        }
        
        @SuppressWarnings("unchecked")
        public boolean pesquisaContaReceber(VendaVO venda){
                Query query = entityManager.createNamedQuery("findContaPagarByVendaPagas");
                query.setParameter("codigoVenda", venda.getCodigo());
                ArrayList<ContaReceberVO> lista = (ArrayList<ContaReceberVO>)query.getResultList();
                if (lista.isEmpty()) {
                        return true;
                } else {
                        return false;
                }
        }
}

